/**
 * 分时数据同步弹窗组件
 * 提供日期选择、快捷日期选择、同步进度等功能
 */
function TimeshareSyncModal(options) {
    this.options = $.extend({}, {
        apiPrefix: ctx + "security/",
        onSyncComplete: null,  // 同步完成回调
        onSyncError: null,      // 同步错误回调
        existingDatePicker: null  // 已有的日期选择器实例，用于复用交易日历数据
    }, options);
    
    this.modalId = 'timeshareSyncModal';
    this.startDatePicker = null;
    this.endDatePicker = null;
    this.currentSymbol = null;
    this.timers = [];  // 存储所有定时器，用于清理
}

/**
 * 显示同步弹窗
 * @param {String} symbol 证券代码
 * @param {String} defaultStartDate 默认开始日期（可选）
 * @param {String} defaultEndDate 默认结束日期（可选）
 */
TimeshareSyncModal.prototype.show = function(symbol, defaultStartDate, defaultEndDate) {
    console.log("TimeshareSyncModal.show 被调用，参数:", {
        symbol: symbol,
        defaultStartDate: defaultStartDate,
        defaultEndDate: defaultEndDate
    });
    
    this.currentSymbol = symbol;
    
    // 移除旧的弹窗（如果存在）
    $('#' + this.modalId).remove();
    
    // 创建弹窗HTML
    var modalHtml = this.createModalHtml();
    console.log("弹窗HTML已创建");
    
    // 添加到页面
    $('body').append(modalHtml);
    console.log("弹窗已添加到页面，modalId:", this.modalId);
    
    // 检查弹窗是否已添加到DOM
    var modalElement = $('#' + this.modalId);
    if (modalElement.length === 0) {
        console.error("弹窗元素未找到！modalId:", this.modalId);
        console.error("尝试查找所有弹窗元素:", $('.timeshare-sync-modal-overlay').length);
        return;
    }
    console.log("弹窗元素已找到，显示状态:", modalElement.is(':visible'));
    console.log("弹窗CSS样式:", {
        display: modalElement.css('display'),
        visibility: modalElement.css('visibility'),
        opacity: modalElement.css('opacity'),
        zIndex: modalElement.css('z-index')
    });
    
    // 强制显示弹窗
    modalElement.css({
        'display': 'flex',
        'visibility': 'visible',
        'opacity': '1'
    });
    
    // 初始化日期选择器
    try {
        // 延迟初始化，确保DOM已完全渲染
        var self = this;
        var timer1 = setTimeout(function() {
            try {
                console.log("开始初始化日期选择器...");
                self.initDatePickers(defaultStartDate, defaultEndDate);
                console.log("日期选择器初始化完成");
                
                // 验证日期选择器是否创建成功
                var startInput = $('#' + self.modalId + 'StartDate');
                var endInput = $('#' + self.modalId + 'EndDate');
                console.log("开始日期输入框:", startInput.length > 0 ? "存在" : "不存在");
                console.log("结束日期输入框:", endInput.length > 0 ? "存在" : "不存在");
                console.log("开始日期选择器实例:", self.startDatePicker ? "存在" : "不存在");
                console.log("结束日期选择器实例:", self.endDatePicker ? "存在" : "不存在");
            } catch (e) {
                console.error("日期选择器初始化失败:", e);
                if (e.stack) {
                    console.error("错误堆栈:", e.stack);
                }
            }
        }, 200);
        this.timers.push(timer1);
    } catch (e) {
        console.error("日期选择器初始化异常:", e);
        if (e.stack) {
            console.error("错误堆栈:", e.stack);
        }
    }
    
    // 绑定事件
    try {
        this.bindEvents();
        console.log("事件绑定完成");
    } catch (e) {
        console.error("事件绑定失败:", e);
        console.error("错误堆栈:", e.stack);
    }
    
    // 设置默认日期范围（近1年）
    if (!defaultStartDate || !defaultEndDate) {
        try {
            var self = this;
            var timer2 = setTimeout(function() {
                try {
                    self.setDefaultDateRange();
                    console.log("默认日期范围已设置");
                } catch (e) {
                    console.error("设置默认日期范围失败:", e);
                    if (e.stack) {
                        console.error("错误堆栈:", e.stack);
                    }
                }
            }, 300);
            this.timers.push(timer2);
        } catch (e) {
            console.error("设置默认日期范围异常:", e);
            if (e.stack) {
                console.error("错误堆栈:", e.stack);
            }
        }
    }
    
    console.log("弹窗显示完成");
};

/**
 * 创建弹窗HTML
 */
TimeshareSyncModal.prototype.createModalHtml = function() {
    var modalId = this.modalId;
    return '<div id="' + modalId + '" class="timeshare-sync-modal-overlay" style="display: block;">' +
        '<div class="timeshare-sync-modal-content">' +
        '<div class="timeshare-sync-modal-header">' +
        '<h3>同步分时数据</h3>' +
        '<button type="button" class="timeshare-sync-modal-close" id="' + modalId + 'Close">&times;</button>' +
        '</div>' +
        '<div class="timeshare-sync-modal-body">' +
        '<div class="sync-date-range-container">' +
        '<div class="sync-date-item">' +
        '<label>开始日期：</label>' +
        '<div style="position: relative;">' +
        '<input type="text" id="' + modalId + 'StartDate" placeholder="选择开始日期" readonly style="width: 150px; padding: 5px; border: 1px solid #ddd; border-radius: 4px; cursor: pointer;"/>' +
        '<div id="' + modalId + 'StartDateCalendar" style="display: none; position: absolute; top: 100%; left: 0; background: white; border: 1px solid #ddd; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); z-index: 10001; width: 280px; padding: 10px; margin-top: 2px;"></div>' +
        '</div>' +
        '</div>' +
        '<div class="sync-date-item">' +
        '<label>结束日期：</label>' +
        '<div style="position: relative;">' +
        '<input type="text" id="' + modalId + 'EndDate" placeholder="选择结束日期" readonly style="width: 150px; padding: 5px; border: 1px solid #ddd; border-radius: 4px; cursor: pointer;"/>' +
        '<div id="' + modalId + 'EndDateCalendar" style="display: none; position: absolute; top: 100%; left: 0; background: white; border: 1px solid #ddd; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); z-index: 10001; width: 280px; padding: 10px; margin-top: 2px;"></div>' +
        '</div>' +
        '</div>' +
        '</div>' +
        '<div class="sync-quick-select-container">' +
        '<span style="margin-right: 10px; color: #666;">快捷选择：</span>' +
        '<button type="button" class="sync-quick-select-btn" data-months="1">近1月</button>' +
        '<button type="button" class="sync-quick-select-btn" data-months="3">近3月</button>' +
        '<button type="button" class="sync-quick-select-btn" data-months="6">近半年</button>' +
        '<button type="button" class="sync-quick-select-btn active" data-months="12">近1年</button>' +
        '<button type="button" class="sync-quick-select-btn" data-months="24">近2年</button>' +
        '</div>' +
        '<div id="' + modalId + 'ProgressContainer" style="display: none; margin: 15px 0;">' +
        '<div class="sync-progress-bar">' +
        '<div id="' + modalId + 'ProgressBar" class="sync-progress-bar-fill" style="width: 0%;"></div>' +
        '</div>' +
        '<div id="' + modalId + 'ProgressText" style="text-align: center; margin-top: 8px; color: #666; font-size: 12px;">0/0 (0%)</div>' +
        '</div>' +
        '</div>' +
        '<div class="timeshare-sync-modal-footer">' +
        '<button type="button" class="sync-data-btn sync-data-btn-cancel" id="' + modalId + 'Cancel">取消</button>' +
        '<button type="button" class="sync-data-btn sync-data-btn-confirm" id="' + modalId + 'Confirm">确定</button>' +
        '</div>' +
        '</div>' +
        '</div>';
};

/**
 * 初始化日期选择器
 */
TimeshareSyncModal.prototype.initDatePickers = function(defaultStartDate, defaultEndDate) {
    var modalId = this.modalId;
    var apiPrefix = this.options.apiPrefix;
    
    // 计算昨天作为最大可选日期
    var today = new Date();
    var yesterday = new Date(today);
    yesterday.setDate(today.getDate() - 1);
    var yesterdayStr = yesterday.toISOString().split('T')[0];
    
    var self = this;
    
    // 如果有已有的日期选择器，复用其交易日历数据
    var existingDatePicker = this.options.existingDatePicker;
    var sharedTradingCalendarData = null;
    if (existingDatePicker && existingDatePicker.tradingCalendarData) {
        sharedTradingCalendarData = existingDatePicker.tradingCalendarData;
        console.log("复用已有日期选择器的交易日历数据，数量:", Object.keys(sharedTradingCalendarData).length);
    }
    
    // 如果已有交易日历数据，重写 initTradingCalendarData 方法，避免重复调用接口
    var originalInitTradingCalendarData = null;
    if (sharedTradingCalendarData && Object.keys(sharedTradingCalendarData).length > 0) {
        // 保存原始方法
        originalInitTradingCalendarData = SecurityDatePicker.prototype.initTradingCalendarData;
        // 重写方法，如果已有数据就不调用接口
        SecurityDatePicker.prototype.initTradingCalendarData = function() {
            if (this.tradingCalendarData && Object.keys(this.tradingCalendarData).length > 0) {
                console.log("交易日历数据已存在，跳过接口调用");
                return;
            }
            // 如果没有数据，调用原始方法
            if (originalInitTradingCalendarData) {
                originalInitTradingCalendarData.call(this);
            }
        };
    }
    
    // 初始化开始日期选择器
    this.startDatePicker = new SecurityDatePicker({
        inputId: modalId + 'StartDate',
        calendarId: modalId + 'StartDateCalendar',
        apiPrefix: apiPrefix,
        maxDate: yesterdayStr,
        autoInitDate: false,
        onDateSelect: function(date) {
            console.log('开始日期选择:', date);
        }
    });
    
    // 如果已有交易日历数据，在初始化之前就设置好
    if (sharedTradingCalendarData && Object.keys(sharedTradingCalendarData).length > 0) {
        // 直接复制交易日历数据对象
        this.startDatePicker.tradingCalendarData = $.extend({}, sharedTradingCalendarData);
        console.log("开始日期选择器已复用交易日历数据，数量:", Object.keys(this.startDatePicker.tradingCalendarData).length);
    }
    
    this.startDatePicker.init();
    
    // 初始化结束日期选择器
    this.endDatePicker = new SecurityDatePicker({
        inputId: modalId + 'EndDate',
        calendarId: modalId + 'EndDateCalendar',
        apiPrefix: apiPrefix,
        maxDate: yesterdayStr,
        autoInitDate: false,
        onDateSelect: function(date) {
            console.log('结束日期选择:', date);
        }
    });
    
    // 如果已有交易日历数据，在初始化之前就设置好
    if (sharedTradingCalendarData && Object.keys(sharedTradingCalendarData).length > 0) {
        // 直接复制交易日历数据对象
        this.endDatePicker.tradingCalendarData = $.extend({}, sharedTradingCalendarData);
        console.log("结束日期选择器已复用交易日历数据，数量:", Object.keys(this.endDatePicker.tradingCalendarData).length);
    }
    
    this.endDatePicker.init();
    
    // 恢复原始方法（如果被重写了）
    if (originalInitTradingCalendarData) {
        SecurityDatePicker.prototype.initTradingCalendarData = originalInitTradingCalendarData;
    }
    
    // 等待日期选择器初始化完成后再设置日期
    var timer = setTimeout(function() {
        try {
            // 设置默认日期
            if (defaultStartDate && self.startDatePicker) {
                self.startDatePicker.setDate(defaultStartDate);
            }
            if (defaultEndDate && self.endDatePicker) {
                self.endDatePicker.setDate(defaultEndDate);
            }
        } catch (e) {
            console.error("设置默认日期失败:", e);
        }
    }, 100);
    // 注意：这个定时器在 initDatePickers 方法中，无法直接添加到 this.timers
    // 但会在弹窗关闭时自动清理
};

/**
 * 绑定事件
 */
TimeshareSyncModal.prototype.bindEvents = function() {
    var modalId = this.modalId;
    var self = this;
    
    // 使用事件委托，确保动态创建的元素也能绑定事件
    // 关闭按钮
    $(document).off('click', '#' + modalId + 'Close, #' + modalId + 'Cancel').on('click', '#' + modalId + 'Close, #' + modalId + 'Cancel', function() {
        self.close();
    });
    
    // 快捷选择按钮（使用弹窗内的选择器）
    $('#' + modalId).off('click', '.sync-quick-select-btn').on('click', '.sync-quick-select-btn', function() {
        var months = parseInt($(this).data('months'));
        self.setDateRange(months);
        // 更新按钮高亮
        $('#' + modalId + ' .sync-quick-select-btn').removeClass('active');
        $(this).addClass('active');
    });
    
    // 确定按钮
    $('#' + modalId).off('click', '#' + modalId + 'Confirm').on('click', '#' + modalId + 'Confirm', function() {
        self.startSync();
    });
    
    // 点击遮罩层关闭
    $('#' + modalId).off('click').on('click', function(e) {
        if ($(e.target).hasClass('timeshare-sync-modal-overlay')) {
            self.close();
        }
    });
};

/**
 * 设置默认日期范围（近1年）
 */
TimeshareSyncModal.prototype.setDefaultDateRange = function() {
    this.setDateRange(12);
};

/**
 * 设置日期范围（根据月份数）
 */
TimeshareSyncModal.prototype.setDateRange = function(months) {
    var today = new Date();
    var yesterday = new Date(today);
    yesterday.setDate(today.getDate() - 1);
    var startDate = new Date();
    startDate.setMonth(today.getMonth() - months);
    
    var endDateStr = yesterday.toISOString().split('T')[0];
    var startDateStr = startDate.toISOString().split('T')[0];
    
    // 查找最近的交易日
    var nearestEndDate = endDateStr;
    var nearestStartDate = startDateStr;
    
    if (this.endDatePicker && this.endDatePicker.findNearestTradingDay) {
        nearestEndDate = this.endDatePicker.findNearestTradingDay(endDateStr);
    }
    
    if (this.startDatePicker && this.startDatePicker.findNearestTradingDay) {
        nearestStartDate = this.startDatePicker.findNearestTradingDay(startDateStr);
    }
    
    if (this.endDatePicker) {
        this.endDatePicker.setDate(nearestEndDate);
    }
    
    if (this.startDatePicker) {
        this.startDatePicker.setDate(nearestStartDate);
    }
};

/**
 * 开始同步
 */
TimeshareSyncModal.prototype.startSync = function() {
    var modalId = this.modalId;
    var symbol = this.currentSymbol;
    var startDate = this.startDatePicker ? this.startDatePicker.getSelectedDate() : null;
    var endDate = this.endDatePicker ? this.endDatePicker.getSelectedDate() : null;
    
    // 验证日期
    if (!startDate || !endDate) {
        $.modal.msgWarning("请选择开始日期和结束日期");
        return;
    }
    
    if (startDate > endDate) {
        $.modal.msgWarning("开始日期不能晚于结束日期");
        return;
    }
    
    // 禁用确定按钮
    var $confirmBtn = $('#' + modalId + 'Confirm');
    $confirmBtn.prop('disabled', true).text('同步中...');
    
    // 显示进度条
    var $progressContainer = $('#' + modalId + 'ProgressContainer');
    var $progressBar = $('#' + modalId + 'ProgressBar');
    var $progressText = $('#' + modalId + 'ProgressText');
    
    $progressContainer.show();
    $progressBar.css('width', '0%');
    $progressText.text('同步中...');
    
    // 调用分时同步接口
    var self = this;
    $.ajax({
        url: this.options.apiPrefix + "time-share/sync",
        type: "POST",
        data: {
            symbol: symbol,
            startDate: startDate,
            endDate: endDate
        },
        dataType: 'json',
        success: function(response) {
            if (response.code === 0) {
                // 同步成功
                $progressBar.css('width', '100%');
                $progressText.text('同步完成');
                
                var successTimer = setTimeout(function() {
                    $.modal.msgSuccess("同步完成");
                    if (self.options.onSyncComplete) {
                        self.options.onSyncComplete();
                    }
                    self.close();
                }, 500);
                self.timers.push(successTimer);
            } else {
                // 同步失败
                $.modal.msgError(response.msg || "同步失败");
                $confirmBtn.prop('disabled', false).text('确定');
                $progressContainer.hide();
            }
        },
        error: function(xhr, status, error) {
            console.error("同步失败:", error);
            var errorMsg = "同步失败";
            if (xhr.responseJSON && xhr.responseJSON.msg) {
                errorMsg = xhr.responseJSON.msg;
            }
            $.modal.msgError(errorMsg);
            $confirmBtn.prop('disabled', false).text('确定');
            $progressContainer.hide();
        }
    });
};

/**
 * 关闭弹窗
 */
TimeshareSyncModal.prototype.close = function() {
    var modalId = this.modalId;
    
    // 清理所有定时器
    for (var i = 0; i < this.timers.length; i++) {
        try {
            clearTimeout(this.timers[i]);
        } catch (e) {
            // 忽略清理定时器时的错误
        }
    }
    this.timers = [];
    
    // 清理事件绑定
    try {
        $(document).off('click', '#' + modalId + 'Close, #' + modalId + 'Cancel');
        $('#' + modalId).off('click', '.sync-quick-select-btn');
        $('#' + modalId).off('click', '#' + modalId + 'Confirm');
        $('#' + modalId).off('click');
    } catch (e) {
        console.error("清理事件绑定失败:", e);
    }
    
    // 移除弹窗
    try {
        $('#' + modalId).remove();
    } catch (e) {
        console.error("移除弹窗失败:", e);
    }
    
    // 清理日期选择器（不需要设置为null，因为下次show时会重新创建）
    this.startDatePicker = null;
    this.endDatePicker = null;
    
    console.log("弹窗已关闭并清理完成");
};

